07 - Returning State/05 - Async Sequence.js (44 lines of code) (raw):

import type { Effect, Element, Component } from 'react'; import sleep from 'then-sleep'; const initialState = { cancelMove() {}, stops: 0, x: 0, y: 0 }; type StopEvent = { lastPosition: [number, number] }; type PropTypes = { onStop: StopEvent => Effect }; const Foo : Component<PropTypes> = ({ props, state = initialState, update, dispatch }) => { function * move(event, cancel) { yield state.cancelMove(); yield update({ ...state, cancelMove: cancel, x: event.x, y: event.y }); yield sleep(500); yield dispatch({ action: 'STOPPED_MOVING' }); yield update({ ...state, stops: state.stops + 1 }); yield props.onStop({ lastPosition: [state.x, state.y] }, cancel); } function leave(event) { return state.cancelMove(); } return ( <div onMouseMove={move} onMouseLeave={leave}> Stopped moving {state.stops} times. </div> ); } Foo.defaultProps = { onStop() {} }; export default Foo;